#ifndef __XLINK_HS_H__
#define __XLINK_HS_H__

/**
  ******************************************************************************
  * @file           : xlinkHS.h
  * @brief          : Header for xlinkHS.c file.
  *                   This file contains the common defines of the application.
  * @author			: ac
  * @attention
  *
  *		Copyright (c) 2023 Technology Co., Ltd.
  *
  *******************************************************************************
  */

//#include "xag_log.h"
#include "xag_types.h"
//#include "camera_compile.h"
//#include "xag_common.h" 
//#include "preisp_msg.h"

#ifdef __cplusplus
extern "C"
{
#endif


/*
 * macro definition
 */
#ifndef SOCKET
#define SOCKET	int
#endif

#define RTK_UDP_SERVER_PORT 10087
#define BUFF_LEN 1024
#define RTK_UDP_SERVER_IP "172.31.0.1"
//#define RTK_UDP_SERVER_IP "10.0.0.1"


/*
 * enum and struction
 */

/* xlinkHS 0x80传输数据(发送) */
typedef struct _xlinhs_0x80_send
{
	/* 
	 * 0x80 
	 */
	XAG_U8 u8Prefix;		/* 1 */

	/* 
	 * bit[3~0]:发送(n+1)次该数据包，譬如，=4则发送5次
	 * bit[7~4]:数据源(程序内部拓展)
	 */
	XAG_U8 u8Retry;			/* 2 */

	/*
	 * =sizeof(Payload)+2
	 */
	XAG_U16	u16Length;		/* 4 */

	/*
	 * 目标设备的地址(对方的地址)
	 * 地址为: 10.0.0.0时表示往本地端口发送数据
	 */
	XAG_U32 u32Address;		/* 8 */

	/*
	 * 数据类型		地址	名称					说明
	 *	0x0000		0x170	配对数据包+单播数据包	设备配对用+只要设备发单播数据都用该数据类型
	 *	0x0001		0x172	RTCM广播数据包			设备广播RTK定位信息
	 *	0x0002		0x174	对讲机广播数据包		设备广播对讲机语言信息
	 */
	XAG_U16 u16DataType;	/* 10 */

	/*
	 * bit[3~0]: 源端口 From
	 *			 0:uart, 1:lan, 2:usb_aoa, 3:usb_cdc
	 * bit[7~4]: 目标端口 To
	 *			 4:uart, 5:lan, 6:usb_aoa, 7:usb_cdc 
	 * 
	 * 兼容:目标端口为0时，表示发送给串口和LAN，相当于0x3x
	 */
	XAG_U8  u8HwPort;		/* 11 */

	/*
	 * PacketType=0，表示正常通信数据包 
	 * PacketType=1，表示固件升级包
	 * PacketType=2，表示配置包(如配置ssid、password)
	 */
	XAG_U8  u8PacketType;	/* 12 */

	/*
	 * 默认:0
	 * LoaclPort=3，表示读取远端wifi参数
	 * 兼容: 读取远端wifi参数需要写3
	 */
	XAG_U8 u8LocalPort;		/* 13 */

	/*
	 * Version=0，表示第一版本(对应HwPort)
	 * Version=1，表示第二版本(对应ToPort和FromPort)
	 */
	XAG_U8 u8Version;		/* 14 */

	/*
	 * 目标端口 
	 *	bit0:uart, 1:lan, 2:usb_aoa, 3:usb_cdc, 4:4G, 5:mesh, 6:XNET, 7:clp, 8:iot_update
	 *	注: Version=1
	 */
	XAG_U16 u16ToPort;		/* 16 */

	/*
	 * 源端口 
	 *	bit0:uart, 1:lan, 2:usb_aoa, 3:usb_cdc, 4:4G, 5:mesh, 6:XNET, 7:clp, 8:iot_update
	 *	注: Version=1
	 */
	XAG_U16 u16FromPort;	/* 18 */

	/*
	 * xnet端口号
	 */
	XAG_U8 u8XnetPort[2];	/* 20 */

	/*
	 * 保留24字节
	 */
	XAG_U8 u8Reserved[24];	/* 44 */

	/*
	 * payload
	 */
	XAG_U8 pu8Payload[0];	/* 不使用时不占空间，作用于结构体的扩展，指向比结构体多出来的字节 */

	/*
	 * crc
	 */
	/*XAG_U16 u16CheckSum;*/
}XlinkHS_0x80_Send_Head_T;

/* xlinkHS 0x80传输数据(返回) */
typedef struct _xlinhs_0x80_return
{
	/* 
	 * 0x80 
	 */
	XAG_U8 u8Prefix;

	/* 
	 * 信号质量
	 */
	XAG_U8 u8Rssi;

	/*
	 * =sizeof(Payload)+2
	 */
	XAG_U16	u16Length;

	/*
	 * 返回数据的设备地址（譬如无人机的地址）
	 */
	XAG_U32 u32Address;

	/*
	 * 数据类型		地址	名称					说明
	 *	0x0000		0x170	配对数据包+单播数据包	设备配对用+只要设备发单播数据都用该数据类型
	 *	0x0001		0x172	RTCM广播数据包			设备广播RTK定位信息
	 *	0x0002		0x174	对讲机广播数据包		设备广播对讲机语言信息
	 */
	XAG_U16 u16DataType;

	/*
	 * bit[3~0]: 源端口 From
	 *			 0:uart, 1:lan, 2:usb_aoa, 3:usb_cdc
	 * bit[7~4]: 目标端口 To
	 *			 4:uart, 5:lan, 6:usb_aoa, 7:usb_cdc 
	 * 兼容:目标端口为0时，表示发送给串口和LAN，相当于0x3x
	 */
	XAG_U8  u8HwPort;

	/*
	 * PacketType=0，表示正常通信数据包 
	 * PacketType=1，表示固件升级包
	 * PacketType=2，表示配置包(如配置ssid、password)
	 */
	XAG_U8  u8PacketType;

	/*
	 * 默认:0
	 * LoaclPort=3，表示读取远端wifi参数
	 * 兼容: 读取远端wifi参数需要写3
	 */
	XAG_U8 u8LocalPort;

	/*
	 * Version=0，表示第一版本(对应HwPort)
	 * Version=1，表示第二版本(对应ToPort和FromPort)
	 */
	XAG_U8 u8Version;

	/*
	 * 目标端口 
	 *	bit0:uart, 1:lan, 2:usb_aoa, 3:usb_cdc, 4:4G, 5:mesh, 6:XNET, 7:clp, 8:iot_update
	 *	注: Version=1
	 */
	XAG_U16 u16ToPort;

	/*
	 * 源端口 
	 *	bit0:uart, 1:lan, 2:usb_aoa, 3:usb_cdc, 4:4G, 5:mesh, 6:XNET, 7:clp, 8:iot_update
	 *	注: Version=1
	 */
	XAG_U16 u16FromPort;

	/*
	 * xnet端口号
	 */
	XAG_U8 u8XnetPort[2];

	/*
	 * 保留24字节
	 */
	XAG_U8 u8Reserved[24];

	/*
	 * payload
	 */
	/*XAG_U8 pu8Payload[0];*/

	/*
	 * crc
	 */
	/*XAG_U16 u16CheckSum;*/
}__attribute__((packed)) XlinkHS_0x80_Return_T;






/*
 * exported functions prototypes
 */ 
XAG_U16 Utils_crc16_ccitt(const XAG_U8 *buf, XAG_U32 len);
XAG_U16 crc_ccitt2(XAG_U8 * input1, int len1, XAG_U8 * input2, int len2);
XAG_U16 crc_ccitt3(XAG_U8 * input1, int len1, XAG_U8 * input2, int len2, XAG_U8 * input3, int len3);


void package_0x80(unsigned char *payload, short payload_len);
int udp_init(void);
bool udp_send_data(SOCKET SocketFd,const char *pSerIP,unsigned short Port,void *pBuff, int len);
void udp_send_msg(int fd, struct sockaddr* dst, unsigned char * buf, int len);
void handle_udp_msg(int fd);
void * udp_recv(void *arg);
void udp_uninit();
void * tcp_recv(void *arg);
int tcp_send(char *psend, int len);
int tcp_init();
void tcp_uninit();
void analysis(unsigned char * pdata, int len);


#ifdef __cplusplus
}
#endif

#endif /* __XLINK_HS_H__ */
